package org.mafagafogigante.dungeon.world;
import org.mafagafogigante.dungeon.date.Date;
import org.mafagafogigante.dungeon.date.DungeonTimeUnit;
import org.mafagafogigante.dungeon.date.Duration;
import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
public class WeatherTest {
@Test
public void testWeatherShouldPresentAllConditionsOverTheCourseOfAYear() {
// Note that this test may fail because of probabilistic issues.
// However, that would indicate an issue with conditions not varying enough, which would be a bug.
Date date = new Date(10, 1, 1);
final Date end = date.plus(1, DungeonTimeUnit.YEAR);
Set<WeatherCondition> conditionSet = new HashSet<>();
Weather weather = new Weather(date);
while (date.compareTo(end) < 0) { // Check until a full year passes.
conditionSet.add(weather.getCurrentCondition(date));
date = date.plus(1, DungeonTimeUnit.HOUR); // Check the condition hourly.
}
Assert.assertThat(conditionSet, CoreMatchers.hasItems(WeatherCondition.values()));
}
@Test
public void testWeatherConditionShouldChangeAtLeastOncePerMonth() {
Date date = new Date(10, 1, 1);
Date lastConditionChange = date;
final Date end = date.plus(10, DungeonTimeUnit.YEAR); // Test over 10 years.
final Duration oneMonth = new Duration(new Date(1, 1, 1), new Date(1, 2, 1));
Weather weather = new Weather(date);
WeatherCondition lastCondition = null;
while (date.compareTo(end) < 0) { // Check until the end date.
if (lastCondition != weather.getCurrentCondition(date)) {
lastCondition = weather.getCurrentCondition(date);
lastConditionChange = date;
}
Assert.assertTrue(new Duration(lastConditionChange, date).compareTo(oneMonth) < 0);
date = date.plus(1, DungeonTimeUnit.HOUR); // Check the condition hourly.
}
}
}